summaryrefslogtreecommitdiff
path: root/app/[lng]/partners/(partners)/evaluation/page.tsx
blob: 3680a82615d60c887abb1215a8bf2dde51f01b75 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import * as React from "react"
import { type SearchParams } from "@/types/table"
import { getValidFilters } from "@/lib/data-table"
import { Skeleton } from "@/components/ui/skeleton"
import { DataTableSkeleton } from "@/components/data-table/data-table-skeleton"
import { Shell } from "@/components/shell"
import { getServerSession } from "next-auth"
import { authOptions } from "@/app/api/auth/[...nextauth]/route"
import Link from "next/link"
import { Button } from "@/components/ui/button"
import { LogIn } from "lucide-react"
import { getEvaluationSubmissions } from "@/lib/vendor-evaluation-submit/service"
import { getEvaluationsSubmitSchema } from "@/lib/vendor-evaluation-submit/validation"
import { EvaluationSubmissionsTable } from "@/lib/vendor-evaluation-submit/table/submit-table"
import { InformationButton } from "@/components/information/information-button"
import { useTranslation } from "@/i18n"
interface IndexPageProps {
  params: Promise<{ lng: string }>
  searchParams: Promise<SearchParams>
}

export default async function IndexPage(props: IndexPageProps) {
  const { lng } = await props.params;
  const { t } = await useTranslation(lng, 'menu')
  const searchParams = await props.searchParams
  const search = getEvaluationsSubmitSchema.parse(searchParams)
  const validFilters = getValidFilters(search.filters)
  
  // Get session
  const session = await getServerSession(authOptions)
  
  // Check if user is logged in
  if (!session || !session.user) {
    // Return login required UI instead of redirecting
    return (
      <Shell className="gap-6">
        <div className="flex items-center justify-between">
          <div>
            <div className="flex items-center gap-2">
              <h2 className="text-2xl font-bold tracking-tight">
                {t('menu.vendor.procurement.evaluation_input')}
              </h2>
              <InformationButton pagePath="partners/evaluation" />
            </div>
            {/* <p className="text-muted-foreground">
            요청된 정기평가를 입력하고 제출할 수 있습니다. 
            </p> */}
          </div>  
        </div>

        <div className="flex flex-col items-center justify-center py-12 text-center">
          <div className="rounded-lg border border-dashed p-10 shadow-sm">
            <h3 className="mb-2 text-xl font-semibold">로그인이 필요합니다</h3>
            <p className="mb-6 text-muted-foreground">
            평가자료를 입력하려면 먼저 로그인하세요.
            </p>
            <Button size="lg" asChild>
              <Link href="/partners">
                <LogIn className="mr-2 h-4 w-4" />
                로그인하기
              </Link>
            </Button>
          </div>
        </div>
      </Shell>
    )
  }
  
  // User is logged in, proceed with vendor ID
  const vendorId = session.user.companyId
  
  // Validate vendorId (should be a number)
  const idAsNumber = Number(vendorId)

  if (isNaN(idAsNumber)) {
    // Handle invalid vendor ID (this shouldn't happen if authentication is working properly)
    return (
      <Shell className="gap-6">
        <div className="flex items-center justify-between">
          <div>
            <h2 className="text-2xl font-bold tracking-tight">
            평가자료 입력
            </h2>
          </div>
        </div>
        <div className="flex flex-col items-center justify-center py-12 text-center">
          <div className="rounded-lg border border-dashed p-10 shadow-sm">
            <h3 className="mb-2 text-xl font-semibold">계정 오류</h3>
            <p className="mb-6 text-muted-foreground">
              업체 정보가 올바르게 설정되지 않았습니다. 관리자에게 문의하세요.
            </p>
          </div>
        </div>
      </Shell>
    )
  }
  
  // If we got here, we have a valid vendor ID
  const promises = Promise.all([
    getEvaluationSubmissions({
      ...search,
      filters: validFilters,
    }, idAsNumber)
  ])
  
  return (
    <Shell className="gap-2">
      <div className="flex items-center justify-between space-y-2">
        <div className="flex items-center justify-between space-y-2">
          <div>
            <h2 className="text-2xl font-bold tracking-tight">
              {t('menu.vendor.procurement.evaluation_input')}
            </h2>
            {/* <p className="text-muted-foreground">
            요청된 정기평가를 입력하고 제출할 수 있습니다. 
            </p> */}
          </div>
        </div>
      </div>
      
      <React.Suspense fallback={<Skeleton className="h-7 w-52" />}>
        {/* DateRangePicker can go here */}
      </React.Suspense>
      
      <React.Suspense
        fallback={
          <DataTableSkeleton
            columnCount={6}
            searchableColumnCount={1}
            filterableColumnCount={2}
            cellWidths={["10rem", "40rem", "12rem", "12rem", "8rem", "8rem"]}
            shrinkZero
          />
        }
      >
        <EvaluationSubmissionsTable promises={promises} />
      </React.Suspense>
    </Shell>
  )
}